/*
 * utils.c
 *
 *  Created on: 15-03-2013
 *      Author: MCzepczyński
 */

/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include "utils.h"

/******************************************************************************************
 *	Deklaracje funkcji															 		 *
 *****************************************************************************************/

void copy_eem_to_ram( void ) {
	eeprom_read_block( &ram_cfg, &eem_cfg, sizeof(ram_cfg) );
}

void copy_ram_to_eem( void ) {
	eeprom_write_block( &ram_cfg, &eem_cfg, sizeof(ram_cfg) );
}

void copy_pgm_to_ram( void ) {
	memcpy_P( &ram_cfg, &pgm_cfg, sizeof(ram_cfg) );
}

void load_defaults( void ) {
	copy_pgm_to_ram();
	copy_ram_to_eem();
}

void check_and_load_defaults( void ) {
	uint8_t i, len = sizeof( ram_cfg );
	uint8_t * ram_wsk = (uint8_t*)&ram_cfg;

	copy_eem_to_ram();
	for(i=0; i<len; i++) {
		if( 0xff == *ram_wsk++ ) continue;
		break;
	}

	if( i == len ) {
		load_defaults();
	}

}

/*
 * 	Funkcja konfigurujaca podzespoly
 */
void config_peripherals(void){
	WIPER_DDR &= ~WIPER;						// konfiguracja portu sygnału z wycieraczki
	WIPER_PORT |= WIPER;

	WIPER_RELAY_DDR |= WIPER_RELAY;				// konfiguracja portu sygnału wyjsciowego wycieraczki
	WIPER_RELAY_PORT |= WIPER_RELAY;

	TURN_LEFT_DDR &= ~TURN_LEFT;				// konfiguracja portów sygnałów kierunkowskazów (lewy / prawy)
	TURN_LEFT_PORT |= TURN_LEFT;
	TURN_RIGHT_DDR &= ~TURN_RIGHT;
	TURN_RIGHT_PORT |= TURN_RIGHT;

	TURN_LEFT_RELAY_DDR |= TURN_LEFT_RELAY;		// koniguracja portów sygnałów wyjsciowych kierunkowskazow (lewy / prawy)
	TURN_LEFT_RELAY_PORT |= TURN_LEFT_RELAY;
	TURN_RIGHT_RELAY_DDR |= TURN_RIGHT_RELAY;
	TURN_RIGHT_RELAY_PORT |= TURN_RIGHT_RELAY;

	TCCR0 |= (1<<WGM01); 				// tryb CTC Timera 0
	TCCR0 |= (1<<CS02) | (1<<CS00); 	// preskaler clk/1024 Timera 0
	OCR0 = F_CPU/1024UL/100UL;			// częstotliwosc 100Hz dla taktowania 16MHz (10ms)
	TIMSK |= (1<<OCIE0); 				// zezwolenie na przerwania dla trybu CTC


	//ADMUX |= (1<<REFS0);							// napięcie odniesienia VCC
	ADCSRA |= (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2);	// wlaczenie ADC i ustawienie preskalera 64


	TCCR2 |= (1<<WGM21);				// trb CTC - Timer 2
	TCCR2 |=  (1<<CS22);				// preskaler 64
	OCR2 = 13;							// czestotliwosc 10kHz
	TIMSK |= (1<<OCIE2);				// zezwolenia na przerwania

	/*Wyłączenie komparatora analogowego*/
	ACSR |= (1<<ACD);

	/*Wyłączenie Watchdoga*/
	WDTCR = 0;

	DDRD &= ~(1<<PD2);
	PORTD |= (1<<PD2);

	DDRC |= (1<<PC0);
	PORTC |= (1<<PC0);

	GIMSK |= (1<<INT0);

	uart_init(_UBRR);

	sei();
}/* config_peripherals */


/*
 * 	Funkcja okreslajaca tryb pracy modulu
 *  Wynik: 0 - tryb pierwotny
 *         1 - tryb komfortowy
 */
uint8_t check_module_config(void){
	if(!(WIPER_PIN & WIPER) && !(TURN_LEFT_PIN & TURN_LEFT)){
		return 1;				// zalacz tryb komfortowy
	} else if (!(WIPER_PIN & WIPER) && !(TURN_RIGHT_PIN & TURN_RIGHT)){
		return 0;				// wylacz tryb komfortowy
	} else{
		return 1;
	}
}/* check_module_config */

/******************************************************************************************
 *	Koniec pliku utils.c
 *****************************************************************************************/

